home *** CD-ROM | disk | FTP | other *** search
- {
- > Can anyone tell me (or give me the source code) how I can grab
- > a screen in textmode and put it later back on the screen.
-
- If you want your software to be compatible, use the following procedures,
- functions and structs:
- }
-
- const
- MaxScr=25;
-
- type
- ScrRec=record Ptr:pointer; Size:word; end;
- ScrType=array[1..MaxScr] of ScrRec; { Pointers to saved screens }
-
- var
- Screen:ScrType;
- ScrCtr:byte; { Index to saved screen }
- v_vidseg:word; { Segmentaddress of video-RAM }
- v_pageinmem:boolean; { screenpage saved in memory }
-
- { current number of rows }
- function rows:byte;
- var tmp:byte;
- begin
- tmp:=mem[$40:$84]+1;
- if tmp<25 then rows:=25 else rows:=tmp;
- end;
-
- { current number of columns }
- function cols:byte;
- var tmp:byte;
- begin
- tmp:=mem[$40:$4a];
- if tmp<80 then cols:=80 else cols:=tmp;
- end;
-
- { save screen }
- procedure setscr;
- begin
- Screen[ScrCtr].Size:=Rows*Cols*2;
- getmem(Screen[ScrCtr].Ptr,Screen[ScrCtr].Size);
- move(mem[v_vidseg:0],Screen[ScrCtr].Ptr^,Screen[ScrCtr].Size);
- inc(ScrCtr);
- v_pageinmem:=true;
- end;
-
- { restore last screen }
- procedure getscr;
- begin
- if ScrCtr>1 then begin
- dec(ScrCtr);
- move(Screen[ScrCtr].Ptr^,mem[v_vidSeg:0],Screen[ScrCtr].Size);
- freemem(Screen[ScrCtr].Ptr,Screen[ScrCtr].Size);
- end else v_pageinmem:=false;
- end;
-
- { determine video-segment: }
- begin
- Regs.ah:=15; { Define actual video-mode }
- intr($10,Regs); { Call BIOS video-interrupt }
- if Regs.al=7 then v_vidseg:=$b000 { Monochrome mode? }
- else v_vidseg:=$b800; { No, Colormode }
- v_pageinmem:=false;
- end.
-
- {
- If you want to create louzy software, which is not compatible at all, use an
- array like:
- vidmem:array[1..25,1..80] of record ch:char; attr:byte; end; absolute
- $b800:0000;
- This array will _ONLY_ work in color-mode on a 25x80 screen. The above
- procedures work in _EVERY_ (!) text-mode.
- If you've setup everything correctly (just do the determine-stuff), then you
- can save a screen by using 'setscr', and restore the screen by 'getscr'. Those
- two must be in balance. If you placed some windows on the screen (and saved all
- the screens), and an error accurs, you can clear the memory by something like:
- while v_pageinmem do getscr;
- MaxScr is not the number of lines (25), but the maximum number of screens which
- can be saved. If you need more or less, set it to something appropriate, but
- use some slack: the structs hardly cost memory (especialy if you compare it
- with the array-type). _ _
- }